Usage “是一种 crossplane 资源,它定义了受管资源或 Composition 资源的使用关系。 Usage 的两个主要用例如下:

1.保护资源不被意外删除。 2.通过确保资源不会在其从属资源被删除之前被删除,实现删除排序。

第一个用例请参阅[删除保护的 Usage](#usage-for-deletion-protection)一节,第二个用例请参阅[删除排序的 Usage](#usage-for-deletion-ordering)一节。

启用 Usage

Usage 是一项 alpha 功能,默认情况下不会启用。

通过[更改 crossplane pod 设置]()启用 “Usage “支持。https://crossplane.devops.gold/master/concepts/pods/#change-pod-settings) 并启用--启用 Usage参数。

 1$ kubectl edit deployment crossplane --namespace crossplane-system
 2apiVersion: apps/v1
 3kind: Deployment
 4spec:
 5# Removed for brevity
 6  template:
 7    spec:
 8      containers:
 9      - args:
10        - core
11        - start
12        - --enable-usages
Tip
crossplane 安装指南](https://crossplane.devops.gold/master/software/install/#feature-flags) 介绍了如何启用功能标志,如–启用 Usage等功能标志。

创建 Usage

A Usage规格有一个强制性的字段,用于定义被引用或被保护的资源。字段字段定义了保护的原因,而 字段字段

定义了使用资源。 这两个字段都是可选的,但至少必须提供其中一个。

Important

Usage 关系可以在 “受管资源 “和 “Composition “之间定义。

但是,除非使用 compositeDeletePolicy Foreground,否则作为使用资源(spec.by)的 Composition 将不起作用,因为它不会在使用默认删除策略 Background 删除自己的资源之前阻止删除其子资源。

删除保护的 Usage

以下示例可防止删除我的数据库资源的删除。原因定义的删除请求。

 1apiVersion: apiextensions.crossplane.io/v1alpha1
 2kind: Usage
 3metadata:
 4  name: protect-production-database
 5spec:
 6  of:
 7    apiVersion: rds.aws.upbound.io/v1beta1
 8    kind: Instance
 9    resourceRef:
10      name: my-database
11  reason: "Production Database - should never be deleted!"

删除排序的 Usage

以下示例可防止删除我的集群资源之前拒绝任何删除请求,从而防止删除我的普罗米修斯图表资源。

 1apiVersion: apiextensions.crossplane.io/v1alpha1
 2kind: Usage
 3metadata:
 4  name: release-uses-cluster
 5spec:
 6  of:
 7    apiVersion: eks.upbound.io/v1beta1
 8    kind: Cluster
 9    resourceRef:
10      name: my-cluster
11  by:
12    apiVersion: helm.crossplane.io/v1beta1
13    kind: Release
14    resourceRef:
15      name: my-prometheus-chart

使用带有 Usage 的选择器

Usage 可以被引用为 选择器来定义被引用或使用的资源。 这样就可以使用 标签匹配控制器引用来定义资源,而不是提供资源名称。

 1apiVersion: apiextensions.crossplane.io/v1alpha1
 2kind: Usage
 3metadata:
 4  name: release-uses-cluster
 5spec:
 6  of:
 7    apiVersion: eks.upbound.io/v1beta1
 8    kind: Cluster
 9    resourceSelector:
10      matchControllerRef: false # default, and could be omitted
11      matchLabels:
12        foo: bar
13  by:
14    apiVersion: helm.crossplane.io/v1beta1
15    kind: Release
16    resourceSelector:
17       matchLabels:
18          baz: qux

Usage 控制器解析选择器后,会将资源名称持久化到资源名称。下面的示例显示了解析选择器后的 Usage 资源。

Important

选择器只解析一次,如果有多个匹配项,则从匹配资源列表中随机选择一个资源。

 1apiVersion: apiextensions.crossplane.io/v1alpha1
 2kind: Usage
 3metadata:
 4  name: release-uses-cluster
 5spec:
 6  of:
 7    apiVersion: eks.upbound.io/v1beta1
 8    kind: Cluster
 9    resourceRef:
10       name: my-cluster
11    resourceSelector:
12      matchLabels:
13        foo: bar
14  by:
15    apiVersion: helm.crossplane.io/v1beta1
16    kind: Release
17    resourceRef:
18       name: my-cluster
19    resourceSelector:
20       matchLabels:
21          baz: qux

Usage in a Composition

Usage 的典型用例是定义 Composition 中资源之间的删除顺序。 Usage 支持选择器中的匹配控制器引用,以确保匹配资源与跨资源引用.

下面的示例显示了一个 Composition,该 Composition 在 “集群 “和 “发布 “资源之间定义了删除顺序。 Usage “阻止删除 “集群 “资源,直到 “发布 “资源被成功删除。

 1apiVersion: apiextensions.crossplane.io/v1
 2kind: Composition
 3spec:
 4  resources:
 5    - name: cluster
 6      base:
 7        apiVersion: container.gcp.upbound.io/v1beta1
 8        kind: Cluster
 9        # Removed for brevity
10    - name: release
11      base:
12        apiVersion: helm.crossplane.io/v1beta1
13        kind: Release
14        # Removed for brevity
15    - name: release-uses-cluster
16      base:
17        apiVersion: apiextensions.crossplane.io/v1alpha1
18        kind: Usage
19        spec:
20          of:
21            apiVersion: container.gcp.upbound.io/v1beta1
22            kind: Cluster
23            resourceSelector:
24              matchControllerRef: true
25          by:
26            apiVersion: helm.crossplane.io/v1beta1
27            kind: Release
28            resourceSelector:
29              matchControllerRef: true
Tip

当 Composition 中有多个相同类型的资源时,“Usage”(使用情况)选项会显示"……"。Usage资源必须唯一标识正在使用或正在使用的资源。 这可以通过使用额外的标签和结合matchControllerRef另一种方法是借助 ToCompositeFieldPathFromCompositeFieldPathToEnvironmentFieldPathFromEnvironmentFieldPath 类型的补丁,直接对 resourceRef.name 进行修补。